package org.ilanchong.droidcontroller.service.threadpool;

import java.util.LinkedList;

import android.util.Log;

/******************************************************************
 * 文件名称 : MainThreadPool.java 
 * 作者 : heinhw@gmail.com
 * 创建时间 : 2012-03-01 下午15:07:00
 * 文件描述 : 主工作线程池
 * 版权声明 : 
 * 修改历史 : 2012-03-01 1.00 初始版本
 *
 ******************************************************************/
public class MainThreadPool extends ThreadGroup {
	
	private static final String TAG = "NetWorkTP";
	/**
	 * 线程池线程数量
	 */
	private final static int mThreadCount = 2;
	
	/**
	 * 彩信发送队列
	 */
	private static MainThreadPool mMmsQueue = new MainThreadPool(mThreadCount);
	
	/**
	 * 线程池是否关闭 
	 */
	private boolean isClosed = false;
	
	/**
	 * 工作队列
	 */
	private LinkedList workQueue;
	
	/**
	 * 线程池的id
	 */
	private static int threadPoolID = 1;
	
	/**
	 * 初始化线程池
	 * @param poolSize 线程池种的线程数量
	 */
	public MainThreadPool(int poolSize)
	{
	
		super(threadPoolID + "");
		setDaemon(true);//线程池守护
		workQueue = new LinkedList();//创建工作队列
		
		for(int i = 0; i < poolSize; i++) 
		{
			new WorkThread(i).start(); //创建并启动工作线程
		}
		Log.d(TAG, "MainThreadPool is working!");
	}
	
	public static MainThreadPool getInstance()
	{	
		return mMmsQueue;
	}
	
	/**
	 * 向线程池中增加任务
	 * @param task
	 */
	public synchronized void execute(Runnable task) 
	{
		if(isClosed) 
		{
			throw new IllegalStateException();
		}
		if(task != null) 
		{
			workQueue.add(task);
			notify();
		}
	}
	
	/**
	 * 在线程池中取出一个任务并执行
	 * @param threadid
	 * @return
	 * @throws InterruptedException
	 */
	private synchronized Runnable getTask(int threadid) 
			throws InterruptedException 
	{
		while(workQueue.size() == 0) 
		{
			if(isClosed) return null;
			
			Log.d(TAG, " Thread " + threadid + " is holding...");
			wait(); //如果工作队列中没有任务,就等待任务
		}
		
		Log.d(TAG, "Thread " + threadid + "is working...");
		
		return (Runnable) workQueue.removeFirst();
	}
	
	/**
	 * 关闭线程池
	 */
	public synchronized void closePool() 
	{
		if(! isClosed) {
			waitFinish();
			isClosed = true;
			workQueue.clear();
			interrupt();
		}
	}
	
	/**
	 * 等待所有任务执行完毕
	 */
	public void waitFinish() 
	{
		synchronized (this) 
		{
			isClosed = true;
			notifyAll();//唤醒所有还在getTask()方法中等待任务的工作线程
		}
		
		Thread[] threads = new Thread[activeCount()]; //activeCount() 返回该线程组中活动线程的估计值。
		int count = enumerate(threads); //enumerate()方法继承自ThreadGroup类，根据活动线程的估计值获得线程组中当前所有活动的工作线程
		for(int i =0; i < count; i++) 
		{ //等待所有工作线程结束
			try {
				threads[i].join();//等待工作线程结束
			}catch(InterruptedException ex) {
				ex.printStackTrace();
			}
		}
	}
	
	/**
	 * 内部类,工作线程,负责从工作队列中取出任务,并执行 
	 * @author wei.han
	 *
	 */
	private class WorkThread extends Thread {
		private int id;
		
		public WorkThread(int id) {
			super(MainThreadPool.this,"MmsThread" + id);
			this.id =id;
		}
		
		public void run() 
		{
			while(!isInterrupted()) 
			{
				Runnable task = null;
				try {
					task = getTask(id);
				}catch(InterruptedException ex) {
					ex.printStackTrace();
				}

				if(task == null) return;
				
				try {
					task.run();
				}catch(Throwable t) {
					t.printStackTrace();
				}
			}
		}
	}
}
